home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / dns / tsig.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  4KB  |  126 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. import hmac
  5. import struct
  6. import dns.exception as dns
  7. import dns.rdataclass as dns
  8. import dns.name as dns
  9.  
  10. class BadTime(dns.exception.DNSException):
  11.     pass
  12.  
  13.  
  14. class BadSignature(dns.exception.DNSException):
  15.     pass
  16.  
  17.  
  18. class PeerError(dns.exception.DNSException):
  19.     pass
  20.  
  21.  
  22. class PeerBadKey(PeerError):
  23.     pass
  24.  
  25.  
  26. class PeerBadSignature(PeerError):
  27.     pass
  28.  
  29.  
  30. class PeerBadTime(PeerError):
  31.     pass
  32.  
  33. _alg_name = dns.name.from_text('HMAC-MD5.SIG-ALG.REG.INT.').to_digestable()
  34. BADSIG = 16
  35. BADKEY = 17
  36. BADTIME = 18
  37.  
  38. def hmac_md5(wire, keyname, secret, time, fudge, original_id, error, other_data, request_mac, ctx = None, multi = False, first = True):
  39.     if first:
  40.         ctx = hmac.new(secret)
  41.         ml = len(request_mac)
  42.         if ml > 0:
  43.             ctx.update(struct.pack('!H', ml))
  44.             ctx.update(request_mac)
  45.         
  46.     
  47.     id = struct.pack('!H', original_id)
  48.     ctx.update(id)
  49.     ctx.update(wire[2:])
  50.     if first:
  51.         ctx.update(keyname.to_digestable())
  52.         ctx.update(struct.pack('!H', dns.rdataclass.ANY))
  53.         ctx.update(struct.pack('!I', 0))
  54.     
  55.     long_time = time + 0x0L
  56.     upper_time = long_time >> 32 & 0xFFFFL
  57.     lower_time = long_time & 0xFFFFFFFFL
  58.     time_mac = struct.pack('!HIH', upper_time, lower_time, fudge)
  59.     pre_mac = _alg_name + time_mac
  60.     ol = len(other_data)
  61.     if ol > 65535:
  62.         raise ValueError, 'TSIG Other Data is > 65535 bytes'
  63.     
  64.     post_mac = struct.pack('!HH', error, ol) + other_data
  65.     if first:
  66.         ctx.update(pre_mac)
  67.         ctx.update(post_mac)
  68.     else:
  69.         ctx.update(time_mac)
  70.     mac = ctx.digest()
  71.     mpack = struct.pack('!H', len(mac))
  72.     tsig_rdata = pre_mac + mpack + mac + id + post_mac
  73.     if multi:
  74.         ctx = hmac.new(secret)
  75.         ml = len(mac)
  76.         ctx.update(struct.pack('!H', ml))
  77.         ctx.update(mac)
  78.     else:
  79.         ctx = None
  80.     return (tsig_rdata, mac, ctx)
  81.  
  82.  
  83. def validate(wire, keyname, secret, now, request_mac, tsig_start, tsig_rdata, tsig_rdlen, ctx = None, multi = False, first = True):
  84.     (adcount,) = struct.unpack('!H', wire[10:12])
  85.     if adcount == 0:
  86.         raise dns.exception.FormError
  87.     
  88.     adcount -= 1
  89.     new_wire = wire[0:10] + struct.pack('!H', adcount) + wire[12:tsig_start]
  90.     current = tsig_rdata
  91.     (aname, used) = dns.name.from_wire(wire, current)
  92.     current = current + used
  93.     (upper_time, lower_time, fudge, mac_size) = struct.unpack('!HIHH', wire[current:current + 10])
  94.     time = (upper_time + 0x0L << 32) + lower_time + 0x0L
  95.     current += 10
  96.     mac = wire[current:current + mac_size]
  97.     current += mac_size
  98.     (original_id, error, other_size) = struct.unpack('!HHH', wire[current:current + 6])
  99.     current += 6
  100.     other_data = wire[current:current + other_size]
  101.     current += other_size
  102.     if current != tsig_rdata + tsig_rdlen:
  103.         raise dns.exception.FormError
  104.     
  105.     if error != 0:
  106.         if error == BADSIG:
  107.             raise PeerBadSignature
  108.         elif error == BADKEY:
  109.             raise PeerBadKey
  110.         elif error == BADTIME:
  111.             raise PeerBadTime
  112.         else:
  113.             raise PeerError, 'unknown TSIG error code %d' % error
  114.     
  115.     time_low = time - fudge
  116.     time_high = time + fudge
  117.     if now < time_low or now > time_high:
  118.         raise BadTime
  119.     
  120.     (junk, our_mac, ctx) = hmac_md5(new_wire, keyname, secret, time, fudge, original_id, error, other_data, request_mac, ctx, multi, first)
  121.     if our_mac != mac:
  122.         raise BadSignature
  123.     
  124.     return ctx
  125.  
  126.